#include <iostream>
#include <pthread.h>
#include <string>
#include <cstdlib>
#include <unistd.h>
#include <thread>
using namespace std;

std::string toHex(pthread_t tid)
{
    char hex[64];
    snprintf(hex, sizeof(hex), "%p", tid);
    return hex;
}

void *threadRoutine(void *args)
{
    while(true)
    {
        cout << "thread id : " << toHex(pthread_self()) << endl; 
        sleep(1);
    }
}
int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");
    cout << "main thread create thread done, new thread id: " << toHex(tid) << endl;
    pthread_join(tid, nullptr);
    return 0;
}





// void threadrun()
// {
//     while(true)
//     {
//         cout << "I am a new thread for C++" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);
//     t1.join();
//     return 0;
// }




// class Request
// {
// public:
//     Request(int start, int end, const string& threadname)
//         :_start(start)
//         ,_end(end)
//         ,_threadname(threadname)
//     {}
// public:
//     int _start;
//     int _end;
//     string _threadname;
// };
// class Response
// {
// public:
//     Response(int result, int exitcode)
//         :_result(result)
//         ,_exitcode(exitcode)
//     {}
// public:
//     int _result; //计算结果
//     int _exitcode; //计算结果是否可靠
// };

// void* sumCount(void* args) //线程的参数和返回值，不仅仅可以用来传递一般参数，也可以传递对象
// {
//     Request *rq = static_cast<Request*>(args);
//     Response *rsp = new Response(0, 0);
//     for(int i = rq->_start; i <= rq->_end; i++)
//     {
//         cout << rq->_threadname << " is runing, caling..., " << i << endl;
//         rsp->_result += i;
//         usleep(100000);
//     }
//     delete rq;
//     return (void*)rsp;
// }

// int main()
// {
//     pthread_t tid;
//     Request* rq = new Request(1, 100, "thread 1"); 
//     pthread_create(&tid, nullptr, sumCount, rq);
//     void* ret;
//     pthread_join(tid, &ret);
//     Response *rsp = static_cast<Response*>(ret);
//     cout << "rsp->result: " << rsp->_result << ", exitcode: " << rsp->_exitcode << endl; 
//     delete rsp;
//     return 0;
// }






// int g_val = 100;

// void show(const string& name)
// {
//     cout << name << "say# " << "hello thread" << endl;
// }

// void* threadRountine(void* args)
// {
//     //PTHREAD_CANCELED
//     const char* name = (const char*)args;
//     int cnt = 5;
//     while(true)
//     {
//         printf("%s, pid:%d, g_val:%d, &g_val:0x%p\n", name, getpid(), g_val, &g_val);
//         // cout << "new thread, pid" << getpid() << endl;
//         //show("[new thread]");
//         sleep(1);
//         // int a = 10;
//         // a = a / 0;
//         cnt--;
//         if(cnt == 0)
//         {
//             break;
//         }
//     }


//     //pthread_exit((void*)100);

//    //exit(11);
//    //return nullptr; //走到这里就默认线程退出了。
//    //return (void*)1; //走到这里就默认线程退出了。
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRountine, (void*)"thread 1");
//     // while(true)
//     // {
//     //     printf("main thread, pid:%d, g_val:%d, &g_val:0x%p, creat new thread tid:%p\n", getpid(), g_val, &g_val, tid);
//     //     // cout << "main thread, pid" << getpid() << ", g_val" << g_val << "&g_val" << &g_val << endl;
//     //     //show("[main thread]");
//     //     g_val++;
//     //     sleep(1);
//     // }
//     //sleep(7);
//     sleep(1); //保证新线程已经启动

//     pthread_cancel(tid);

//     void* retval;
//     pthread_join(tid, &retval); //main thread等待的时候，默认是阻塞等待的
//     cout << "main thread quit..., ret: " << (long long)retval << endl; 


//     return 0;
// }






// void *threadRun(void* args)
// {
//     while(1)
//     {
//         std::cout << "new thread:" << getpid() << std::endl;
//         sleep(1); 
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, nullptr);
//     while(1)
//     {
//         std::cout << "main thread:" << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }